package cn.adelyn.base.snowflake.config;

import cn.hutool.core.lang.Snowflake;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

/**
 * @author chengze
 * @date 2022/8/27
 * @desc 分布式系统内的唯一id
 */
@Component
public class SnowflakeIdUtil implements InitializingBean {

    /**
     * 机器id
     */
    private long workedId = 1L;
    /**
     * 数据中心id
     */
    private long dataCenterId = 1L;

    /**
     * 维护一个hutool实现的snowflake单例
     */
    private static Snowflake snowflake;

    @Override
    public void afterPropertiesSet() {
        //高并发场景下缓存时间，并在后台维护一个线程每毫秒更新一次时间，不直接获取系统时间，降低延时
        snowflake = new Snowflake(workedId, dataCenterId, true);
        //与上面的差距不大，低并发场景没必要多维护一个线程  但可以减小抖动！ 还是维护多维护一个吧
//        snowflake = new Snowflake(workedId, dataCenterId);
    }

    public long genSnowflakeId(){
        return snowflake.nextId();
    }
}
